Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Історія версій
- "Початкова історія"v9.3.112.08.2026
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюЯкщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.
Посилання на документацію на GitHubСкопіювати документацію у форматі Markdown в буфер обміну
Плагін ESLint x OXLint
eslint-plugin-intlayer виявляє ті типи помилок i18n, які TypeScript не здатний помітити:
- Жорстко закодований текст, який так і не потрапив до словника.
- Динамічні виклики, які проходять перевірку типів і виконуються, але які компілятор Intlayer не може оптимізувати.
- Мертвий вміст (Dead content) — словники та поля, які ніде в проєкті не зчитуються (за бажанням/opt-in).
Невідомі ключі словників, невідомі шляхи до полів та відсутні локалі вже є помилками компіляції, тому плагін не дублює їх повідомлення.
Встановлення
Скопіюйте код у буфер обміну
Потрібен ESLint 9 або новішої версії (flat config). ESLint 10 підтримується.
Використання
Плагін працює як в ESLint, так і в oxlint — однакові правила, однакові параметри.
Скопіюйте код у буфер обміну
Або розгорніть конфігурацію та задайте рівні самостійно:
Скопіюйте код у буфер обміну
Скопіюйте код у буфер обміну
Два застереження: підтримка JS-плагінів в oxlint все ще на стадії альфа, і oxlint не підтримує кастомні парсери — тому файли .vue, .svelte, .astro та шаблони Angular там не лінтяться. Запускайте oxlint для ваших файлів JS/TS/JSX, а для решти використовуйте ESLint.
Правило no-unused-content навмисно виключено вище: йому потрібні робоча директорія та шлях до перевіреного файлу з контексту правила, чого альфа-міст для JS-плагінів не гарантує. Запускайте його під ESLint.
Конфігурації (Configs)
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Конфігурація | no-raw-text | static-dictionary-key | no-dynamic-field-access | enforce-adapter-import | no-unused-content |
|---|---|---|---|---|---|
recommended | warn | error | error | off | off |
strict | error (+ рядкові літерали поза JSX) | error | error | error | off |
contract-only | off | error | error | off | off |
recommended навмисно залишає no-raw-text зі статусом warn: застосування правила до наявної кодової бази виявить усі неперекладені рядки одночасно, що не повинно ламати збірку з першого ж дня.
enforce-adapter-import типово вимкнено — увімкніть його явно, якщо це необхідно.
no-unused-content вимкнено в усіх пресетах, включно зі strict. Це єдине правило, яке зчитує конфігурацію Intlayer і сканує вихідні файли з диска, тому його ввімкнення має бути свідомим вибором.
Правила
no-raw-text
Повідомляє про текст для користувача, який не оголошено у словнику. Використовує ту саму логіку виявлення, що й intlayer extract, тому назви брендів, класи CSS та технічні ідентифікатори ігноруються.
Скопіюйте код у буфер обміну
Файли оголошення вмісту (*.content.ts, …) пропускаються.
Щоб виправити весь файл одночасно, виконайте npx intlayer extract, і компілятор автоматично перенесе рядки до словника.
Параметри
Скопіюйте код у буфер обміну
static-dictionary-key
Вимагає, щоб ключ словника був рядковим літералом.
Компілятор може попередньо завантажити словник лише тоді, коли може прочитати ключ безпосередньо в місці виклику. У разі використання обчислюваного ключа оптимізація мовчки пропускається, і замість цього в бандл включаються всі словники.
Скопіюйте код у буфер обміну
Це стосується useIntlayer, getIntlayer та всіх адаптерів сумісності (useTranslation, useTranslations, formatMessage, <FormattedMessage id>, <Trans i18nKey>, …).
no-dynamic-field-access
Вимагає, щоб поле, яке зчитується зі словника, було статично відомим.
Компілятор видаляє поля, використання яких він не виявив. Динамічний доступ для нього невидимий, тому читання може повернути undefined під час виконання.
Скопіюйте код у буфер обміну
enforce-adapter-import
Віддає перевагу адаптеру сумісності @intlayer/* перед оригінальним пакетом. Оригінальний пакет переходить в Intlayer лише за наявності налаштованого псевдоніма бандлера; адаптер працює завжди. Підтримує автовиправлення через --fix.
Скопіюйте код у буфер обміну
no-unused-content
Типово вимкнено. Повідомляє про вміст, який ніде в проєкті не зчитується, а також про ключі словників, оголошені в кількох місцях.
Скопіюйте код у буфер обміну
На відміну від інших правил, це правило не може вирішити лише за поточним файлом — поле є невикористаним лише відносно всього проєкту. Під час першого оголошення вмісту під час лінтингу воно завантажує конфігурацію Intlayer, сканує вихідні файли за шляхами з конфігурації (build.traversePattern, compiler.transformPattern) і запускає той самий аналізатор використання, який живить @intlayer/lsp та закреслення «невикористаного» в розширенні VS Code. Результат кешується на cacheTtl мілісекунд, тому сканування відбувається один раз за запуск, а не для кожного файлу.
Параметри
Скопіюйте код у буфер обміну
Зменште cacheTtl, якщо ви запускаєте лінтинг із довгоживучого сервера редактора і хочете швидше бачити зміни; встановіть baseDir, коли один запуск лінтингу охоплює кілька проєктів Intlayer у монорепозиторії.
Схильне до мінімізації помилкових спрацьовувань. Хибне спрацьовування тут призведе до видалення потрібного перекладу, тому нічого не повідомляється, якщо словник використовується способом, який аналіз не може відстежити: об'єкт вмісту передано повністю, прив'язана функція перекладача (const t = useTranslations("home")), оголошення отримано через прямий імпорт (useDictionary(myDictionary)), викликnest()з іншого словника або список полів, який став невичерпним через оператор spread. Однофайлові компоненти (.vue,.svelte,.astro) вважаються такими, що використовують кожне поле згаданих словників, оскільки їхні блоки скриптів тут не парсяться.
reportDuplicateKeys зчитує необ'єднані словники, які збірка записує у .intlayer/, тому воно залишається неактивним, доки проєкт не буде зібрано принаймні один раз. Два оголошення з однаковим ключем об'єднуються, що є коректним шаблоном — звіт формується тому, що поле, визначене з обох боків, непомітно зберігає лише одне з двох значень.
Аналізатор завантажується з @intlayer/lsp, який постачається як ESM. Тому правилу потрібна версія Node, здатна виконувати require() для ES-модулів — Node 20.19+ або 22.12+. На старіших версіях воно нічого не повідомляє, щоб не зупиняти процес лінтингу.
Фреймворки
Кожне правило працює в усіх інтеграціях Intlayer, включно з шаблонами Vue, Svelte та Angular. Потрібно лише вказати ESLint, який парсер зчитує кожен тип файлів.
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Фреймворк | Файли | Парсер |
|---|---|---|
| React, Preact, Solid, Lit | .jsx .tsx | typescript-eslint |
| Next.js | .jsx .tsx | typescript-eslint |
| Vue, Nuxt | .vue | vue-eslint-parser |
| Svelte, SvelteKit | .svelte | svelte-eslint-parser |
| Angular | .ts | typescript-eslint |
| Шаблони Angular | .component.html | @angular-eslint/template-parser |
| Astro | .astro | astro-eslint-parser |
Скопіюйте код у буфер обміну
Встановлюйте лише ті парсери, які потрібні вашому проєкту.
Відоме обмеження. У шаблонах Vue та Angular вираз на кшталт{{ content[key] }}не перевіряється правиломno-dynamic-field-access. Динамічні звернення всередині блоку script виявляються у звичайному режимі.
