What's fixed (finally, actually this time)
⏳ Hero subtitle stuck on "Loading..." — for real this time
My previous fixes stopped Promise.all rejections from clobbering the render, but the subtitle was STILL getting overwritten back to "Loading..." on every language-change pass. Why?
Root cause: applyStaticTranslations walks every [data-i18n] element and sets textContent = translation. My v1.7.5 "skip populated containers" guard only caught elements with child elements — but abSaSub (the hero subtitle), abSaRankBarPct, and several others are text-only leaf nodes. They sailed right past the guard. So loadAll would write "Completion: 42% • Score: 1234", then the next translation pass would walk over and reset it to "Loading...".
Fix: applyStaticTranslations now explicitly skips data-i18n="common.loading". That placeholder is visible for under a second during cold-start anyway; once real content lands it never gets wiped.
🌍 Admin catalog category headings + rarity labels finally French
v1.7.6 added ?lang= to /admin/badge-catalog so badge Title and Description arrived localised. But the client-side renderer was still printing group.Category and badge.Rarity verbatim (the raw server strings, always English).
Fix: added _trCategory + _trRarity helpers to the admin-page IIFE that reuse the existing category.* / rarity.* i18n keys. Applied to renderCatalog, renderShowcase, renderEquippedBadges, renderBadges. A French admin now sees:
- "Premiers pas" instead of "Getting Started" on section headings
- "Commun" / "Peu commun" / "Légendaire" instead of "Common" / "Uncommon" / "Legendary" on every badge row
📘 README update
- Rewrote the Friends section for the v1.7.x drawer (global floating button, bi-directional requests, type-to-search, playback auto-hide, unread badge, mutual + auto-accept)
- Added sections for the rarity-% chip (v1.7.6) and the 3-layer data-loss recovery chain (v1.7.5)
- Status banner bumped to v1.7.7; @frenchyx24 credit preserved
MD5: D7B91E43825CFA0FDAAAFE82B7D38E9E