setLang(SCRIPT_LANG) вызывается после page.reload(), потому что
forceLang сбрасывается между reload-ами и resolveLang ставил LANG='ru'.
Жёсткая проверка 'Бросков' в дневнике сделана языкозависимой.
Переименована LANG -> SCRIPT_LANG для избежания конфликта с глобальной LANG.
Перегенерированы screenshots-wiki (ru) и screenshots-wiki-en (en) — по 30 кадров.
18 кадров: desk 1280x720@1x, mobp 360x640@2x -> 720x1280 (9:16), mobl 800x450@1.6x -> 1280x720 (16:9). Все — 24-битный PNG без альфа-канала (конверсия ffmpeg/ImageMagick), длинная сторона 1280 (треб. каталога: 1280..2560). Ландшафт — 800x450 CSS, не 640x360: мобильная 'низкая' ветка @media(max-height:620px) та же, но карточка улова с RV-кнопкой (Y2) целиком влезает, а на 360px .panel скроллится и дно уезжает за экран.
Детерминизм: чистый сейв на каждом вьюпорте (localStorage.clear), поклёвка — forceBite, карточка — всегда золотой осётр 12.5 кг (SHINY_CHANCE=1, rnd цены шпилится в 0.5 -> ровно +2438 во всех сетках), закрытие карточки — реальный клик + DOM-фолбэк + жёсткое ожидание (лавка не снимается поверх карточки), тосты стухают (1.6 с) до кадра карточки.
Выпуск — screenshots-wiki/ (18 png). Запуск: node tests/gen-screenshots.js [каталог-сборки] [папка-вывода]; нужны Chromium, Noto Color Emoji, ffmpeg или ImageMagick.