diff --git a/public/css/app.css b/public/css/app.css index 3733ce7..00ff92f 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -409,13 +409,20 @@ body:not(.i18n-ready) .navbar .nav-link, body:not(.i18n-ready) .navbar .navbar-text, body:not(.i18n-ready) .navbar .btn { transition: filter 220ms ease, opacity 220ms ease, transform 220ms ease; - /* Light mode & default: fully fade out navbar until i18n is ready - so fallback labels never flash. */ - opacity: 0; - transform: translateY(-2px); + /* Light mode & default: muted appearance while i18n loads. */ + filter: blur(1.2px) saturate(0.95); + opacity: 0.45; + transform: translateY(-1px); pointer-events: none; } +/* Light mode: keep navbar container visible to avoid layout jump. */ +html:not([data-theme="dark"]) body:not(.i18n-ready) nav.navbar, +html:not([data-theme="dark"]) body:not(.i18n-ready) .navbar { + opacity: 1; + transform: none; +} + /* Dark mode: keep the original soft blur effect while loading so the navbar stays visible but its text is obscured. */ html[data-theme="dark"] body:not(.i18n-ready) nav.navbar, diff --git a/public/js/app_player.js b/public/js/app_player.js index 5b33cc6..5548f1b 100644 --- a/public/js/app_player.js +++ b/public/js/app_player.js @@ -656,7 +656,7 @@ function initUserRating({ movieId, token, initial } = {}) { isSaving = true; buttons.forEach((b) => b.setAttribute('disabled', 'disabled')); - metaEl.textContent = 'Enregistrement…'; + metaEl.textContent = t('player.saving', 'Saving…'); const shouldClear = currentRating && value === currentRating; const result = shouldClear