i18n.lock — это lockfile, в котором хранятся SHA-256-отпечатки исходного контента. CLI Lingo.dev сравнивает эти отпечатки при каждом запуске, чтобы определить, какие строки новые или изменённые, — только они попадают в пайплайн перевода. Всё остальное пропускается.
Структура#
Lockfile использует формат YAML:
version: 1
checksums:
a07974ea09011daa56f9df706530e442:
title: f8692d39317193acf0e2e47172703c46
description: g9703e40428204bdf1f3f58283814d57| Поле | Описание |
|---|---|
version | Версия схемы lockfile. |
checksums | Сопоставление отпечатков контента. Каждая запись связывает хеш исходного контента с хешем ключа. |
Структура с двумя хешами (хеш контента + хеш ключа) позволяет отслеживать переименование ключей — CLI сохраняет существующие переводы, если ключ переименован, а его содержимое осталось прежним.
Процесс#
Первый запуск — создаёт lockfile с отпечатками всего исходного контента:
npx lingo.dev@latest run
# Creates i18n.lockПоследующие запуски — переводят только изменения:
npx lingo.dev@latest run
# Compares against i18n.lock, translates only changesПринудительный повторный перевод — игнорирует lockfile и заново переводит всё:
npx lingo.dev@latest run --forceПересоздание lockfile — заново собирает lockfile по текущему состоянию исходных файлов:
npx lingo.dev@latest lockfile --forceИспользуйте lockfile --force, чтобы сбросить lockfile при разрешении конфликтов слияния. Эту команду можно безопасно запускать в любой момент.
Замороженная проверка — завершается с ошибкой, если какой-либо контент требует перевода (для CI/CD):
npx lingo.dev@latest run --frozenУдаление дубликатов#
При слиянии веток YAML-файл lockfile может накапливать дублирующиеся записи. CLI автоматически удаляет дубликаты при каждой загрузке: повторяющиеся ключи в пределах одного блока контрольной суммы разрешаются сохранением последнего вхождения. Если дубликаты были удалены, CLI записывает их количество в лог.
Удаление дубликатов выполняется во всех командах, которые читают lockfile: run, status, lockfile и других.
Контроль версий#
i18n.lock должен быть закоммичен в репозиторий вместе с файлами локалей. Именно этот механизм делает возможным инкрементальный перевод — без него при каждом запуске заново переводился бы весь проект.
