Как я автоматизировал перевод 10 000 строк на 3 языка за один день
Frontend-тимлид из Казахстана описывает, как за один день перевёл «захардкоженный» русский UI в крупной HR-платформе (8000+ TypeScript-файлов) на два дополнительных языка — английский и казахский — без недели ручного копипаста.
Итог автоматизации: 9 823 ключа переводов, 39 086 вызовов t() в коде, обработано 8 198 файлов; суммарное время работы скриптов — около 5 минут.
- Пайплайн: EXTRACT → SYNC → TRANSLATE → CONVERT (четыре узкоспециализированных скрипта).
- EXTRACT: поиск русских строк (regex по кириллице), генерация ключей, замена строк на
t(), исключения для уже обёрнутого текста и логов. - SYNC: синхронизация структуры JSON локалей и контроль заполненности (пример: после извлечения ru 100%, en/kk — 11% до автоперевода).
- TRANSLATE: автоперевод пустых значений через API — DeepL для EN и
Google Translate для KK (батчинг по 50 строк, параллелизация, паузы из-за rate limiting). - CONVERT: устранение раннего вызова i18n в константах — замена значений на ленивые getter'ы, чтобы
t()не вызывался при импорте.
Грабли: JSX-атрибуты требуют синтаксиса вида {t(...)}, шаблонные строки превращаются в t("key", { name }), нужно учитывать alt у img, бороться с дублями фраз (например, «Сохранить» десятки раз) и с банами Google при частых запросах. Минусы подхода: автопереводы «80% ок, 20% — на вычитку», после смены языка требуется перезагрузка, а ключи на транслитерации выглядят неаккуратно (вместо семантических неймспейсов).
Читайте также
Как OpenAI похоронила традиционный BI — и что пришло ему на смену
Почему страницы сайта выпадают из индекса
MVVM для курильщика: почему ваша ViewModel — это помойка на 2000 строк и как это исправить
Как закон «О запрете иностранных слов» влияет на рекламу и брендинг
А деньги где? Проверяем сайт на ошибки поисковой оптимизации: как сделать SEO окупаемым и увеличить число заявок
- AST-подход к массовой i18n-миграции в TS/React: Для больших TypeScript/React-кодовых баз безопаснее извлекать строки через AST (Babel parser + traverse + generator), чем через «поиск/замену» по regex. Так можно точечно обрабатывать StringLiteral/JSXText/TemplateLiteral и учитывать контекст (импорты, ключи объектов, TS-типы), уменьшая риск поломок и пропусков строк.
[Инженерия → Локализация (i18n)]
Зарегистрированные пользователи видят только два тезиса.
Зарегистрироваться