Привет, Хабр! Это продолжение первой статьи, где я автоматизировал перевод 10 000 строк скриптами. Скрипты оказались полезными — решил оформить в npm-пакет.
Что изменилось
Было: 4 отдельных скрипта, которые нужно копировать в проект.
Стало: npm install -D i18next-toolkit и готово.
# Раньше
node scripts/extract-russian.mjs --mode=report
node scripts/sync-locales.mjs
node scripts/translate-locales.mjs
# Теперь
npx i18next-toolkit extract
npx i18next-toolkit update # sync + translate одной командой
Что добавил
1. Конфиг вместо хардкода
i18next-toolkit init
Создаёт .i18next-toolkitrc.json:
{
"localesPath": "public/locales",
"sourceLanguage": "ru",
"targetLanguages": ["en", "kk"],
"include": "src/**/*.{ts,tsx,js,jsx}",
"batchSize": 50,
"concurrency": 5
}
Больше не нужно лезть в код скрипта чтобы поменять пути.
2. Watch-режим
i18next-toolkit watch
Следит за изменениями файлов и автоматически извлекает новые строки. Удобно при разработке.
3. Кэширование переводов
Переводы сохраняются в .i18next-toolkit-cache.json. Повторный запуск не тратит API-запросы на уже переведённые строки.
4. Статистика и диффы
# Сколько переведено
i18next-toolkit stats
# ru: 100% (9823/9823)
# en: 95% (9332/9823)
# kk: 87% (8546/9823)
# Что отличается между языками
i18next-toolkit diff --source=ru --target=en
5. Валидация для CI
i18next-toolkit validate --strict
i18next-toolkit sort --check
Проверяет:
Пустые значения
Несовпадение интерполяций (
{{name}}в ru, но{{user}}в en)Лишние/недостающие ключи
Сортировку ключей
6. Поддержка любых языков
В первой версии был хардкод на русский. Теперь:
# Китайский
i18next-toolkit extract --source-pattern="[\u4e00-\u9fff]"
# Арабский
i18next-toolkit extract --source-pattern="[\u0600-\u06FF]"
7. Очистка неиспользуемых ключей
i18next-toolkit clean --dry-run
# Found 47 unused keys
# - extracted.old_button
# - extracted.deprecated_label
# ...
i18next-toolkit clean # удалить
CLI команды
Команда |
Что делает |
|---|---|
|
Находит строки, заменяет на |
|
Синхронизирует структуру JSON |
|
Переводит через Google Translate |
|
sync + translate одной командой |
|
Следит за файлами |
|
Показывает покрытие |
|
Сравнивает языки |
|
Удаляет неиспользуемые ключи |
|
Сортирует ключи по алфавиту |
|
Проверяет на ошибки |
|
Ищет ключи без перевода |
Программный API
import { extract, sync, translate, update } from 'i18next-toolkit';
// Извлечь строки
await extract({
mode: 'extract',
include: 'src/**/*.tsx',
autoGetters: true, // решает проблему с константами
});
// Синхронизировать + перевести
await update({
sourceLanguage: 'ru',
targetLanguages: ['en', 'de', 'fr'],
});
CI/CD
# .github/workflows/i18n.yml
name: i18n Check
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npx i18next-toolkit validate --strict
- run: npx i18next-toolkit sort --check
- run: npx i18next-toolkit find-missing
Теперь PR не пройдёт если:
Есть пустые переводы
Ключи не отсортированы
Есть использование несуществующих ключей
Установка
npm install -D i18next-toolkit
# или
yarn add -D i18next-toolkit
# или
pnpm add -D i18next-toolkit
Быстрый старт
# 1. Установить
npm install -D i18next-toolkit
# 2. Создать конфиг
npx i18next-toolkit init
# 3. Посмотреть что найдётся
npx i18next-toolkit extract
# 4. Извлечь и перевести
npx i18next-toolkit extract --mode=extract
npx i18next-toolkit update
npm: npmjs.com/package/i18next-toolkit
GitHub: github.com/Niyaz-Mazhitov/i18next-toolkit
Буду рад фидбеку, issues и PR.
Комментарии (4)

cmyser
29.12.2025 16:16А знаете в каком веб фрейморке это есть нативно из коробки ?) Как верное архитектурное решение
Скрытый текст
$mol

niyaz_kz Автор
29.12.2025 16:16Знаю про $mol, интересный подход. Но когда проект уже на React с 8000 файлов - менять фреймворк не вариант, проще автоматизировать то что есть)
savostin
Я так понимаю, с английским посложнее будет? ;)
niyaz_kz Автор
Хороший вопрос! Да, с английским сложнее — regex
[a-zA-Z]поймает и"Save"и"userId".Для англоязычных проектов работают другие стратегии:
Извлекать только из JSX children и определённых атрибутов (
placeholder,aria-label)Исключать camelCase/snake_case строки
Использовать whitelist паттернов (строки с пробелами, пунктуацией)
Пока библиотека заточена под "видимый" исходный язык (русский, китайский, арабский). Но идея хорошая добавлю в issues.