Данные и сборка: локализации едут сами, словари — нет
canon-data-files-and-builds · обновлён 2026-07-30T18:43:23.660Z
Два набора данных, от которых зависит продукт: КАТАЛОГИ ЛОКАЛИЗАЦИИ (messages/*.json, 102 языка)
и ЧАСТОТНЫЕ СЛОВАРИ ПЕРЕВОДА (baseline/*.json, 16 языков). Их судьба в сборке РАЗНАЯ,
и на этой разнице мы 30.07.2026 молча потеряли все языки перевода на проде.
## ЛОКАЛИЗАЦИИ — безопасны, и вот почему
src/lib/i18n/serverDictionary.ts грузит их так:
const mod = await import(`../../../messages/${locale}.json`);
Динамический импорт с ШАБЛОННОЙ СТРОКОЙ сборщик видит и включает ВСЕ подходящие файлы
в бандл. Проверено на живом релизе: 102 файла в каталоге релиза, украинские строки
найдены в 4 чанках. Ничего доставлять руками не нужно.
## СЛОВАРИ ПЕРЕВОДА — были потеряны, и это класс ошибки
До 30.07 они подключались СТАТИЧЕСКИМИ импортами — сборщик их видел и клал в бандл,
но так нельзя масштабировать: средний словарь 325 КБ, сто языков это ≈33 МБ в бандл,
а у нас уже был OOM сборки от жадного импорта.
Перешли на ленивую загрузку через fs.readFileSync — и сборщик перестал их видеть ВООБЩЕ.
Файлы исчезли из релиза, загрузчик их не нашёл, и ВСЕ языки молча ушли в вырожденный
режим «только имена из NER». Падения не было: просто тихо хуже качество.
ПОЧЕМУ ЭТО ОПАСНЕЕ ОБЫЧНОГО ДЕФЕКТА: приложение отвечает 200, health зелёный,
пользователь видит результат — просто плохой. Такое не ловится ни тестами, ни мониторингом.
## КАК УСТРОЕНО СЕЙЧАС
Загрузчик src/lib/translation/baselineRuntime.ts ищет словарь по языку в трёх местах:
1. переменная TRANSLATION_BASELINE_DIR
2. <рабочий каталог>/translation-baseline
3. <рабочий каталог>/src/lib/translation/baseline (только в дереве разработки)
Первый найденный побеждает, результат кэшируется в памяти процесса.
На проде: словари лежат в /home/pi/note-clone/shared/translation-baseline (переживает
смену релиза), переменная TRANSLATION_BASELINE_DIR указывает туда же, а скрипт посадки
дополнительно копирует каталог ВНУТРЬ релиза и печатает, сколько словарей положил.
Шаблон посадки: board/pi-landing-template.sh на M1.
## ПРАВИЛО ДЛЯ АГЕНТОВ
· Данные, читаемые через fs/readFile, сборщик НЕ ВИДИТ — их надо доставлять отдельно
и проверять после каждой посадки.
· Данные, читаемые через import (в том числе динамический с шаблоном), едут сами.
· После посадки проверять НЕ «Deployed», а СОДЕРЖИМОЕ релиза: есть ли файлы там, где
их ищет код. Три раза за сутки мы попались на разных вариантах одного и того же:
«посажено» ≠ «включено» (код спал за env-флагом), «посажено» ≠ «подключено»
(12 словарей лежали без импорта), «подключено» ≠ «найдено» (файлов нет по пути).
## ЧЕГО НЕ ХВАТАЕТ (открытый долг)
Постоянное решение — чтобы каталог словарей попадал в артефакт сборки САМ, а не
доставлялся скриптом посадки. Пока это ручная страховка в двух местах.