Open source-проект · 2026
Переводчик XLF-файлов для Angular
Консольная утилита на Node.js: переводит XLF-файлы Angular через Google Translate, сохраняя теги, отступы и готовые переводы.
- Роль
- Автор и мейнтейнер
- Период
- 2026
- Стек
- Node.js, Angular i18n, XLIFF, Google Translate, npm
Задача
messages.en.xlf, messages.tr.xlf, messages.kk.xlf и дальше по списку. Вручную это долгое копирование между файлом и переводчиком, а платформа локализации ради черновых переводов — лишняя подписка и интеграция.
<x id="…"/> — на их месте интерполяции и переносы строк. Если отдать строку переводчику как есть, теги потеряются или исказятся, и перевод придётся чинить руками.
Решение
fs и https. Утилита запускается в папке с переводами и обходит все XLF-файлы в ней:
npx translate-xlf --from=ru --exclude=enЯзык — из имени файла: messages.tr.xlfпереводится на турецкий,messages.kk.xlf— на казахский. Файл без кода языка пропускается.Теги не трогаются: перед отправкой<x …/>заменяются плейсхолдерами, после перевода возвращаются на место.Файл правится построчно, а не пересобирается из XML-дерева. Отступы и многострочные<source>и<target>остаются как были, поэтому в диффе видны только новые переводы.Готовое не перезаписывается: строки соstate="translated"иfinalпропускаются. Переведённые получаютstate="translated", а с флагом--keep-stateсохраняют свой статус.Ошибки не теряются: запросы идут пачками, неудачный повторяется. Если строку перевести так и не удалось, она помечается[ОШИБКА ПЕРЕВОДА]и переводится заново при следующем запуске.
Когда Google начал блокировать
429 и страницей «your computer or network may be sending automated queries». При этом тот же запрос через curl или встроенный в Node fetch проходил.
https по умолчанию не отправляет расширение ALPN, и по этому отпечатку Google отличал скрипт от браузера. В версии 1.0.3 запросы идут через https.Agent с ALPNProtocols: ['http/1.1'] — рукопожатие совпадает с тем, что делает fetch, и блокировка ушла. Способ быстро отличить блокировку клиента от блокировки сети описан в README.
Результат
messages.XX.xlf и один запуск. Машинный перевод остаётся черновиком, который стоит вычитать перед релизом, но рутина копирования строк уходит.