Привет, Хабр! Это продолжение первой статьи, где я автоматизировал перевод 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.
