diff --git a/frontend/index.html b/frontend/index.html index 7c213a1..5be30e5 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -156,7 +156,7 @@ diff --git a/frontend/js/app.js b/frontend/js/app.js index 3be469e..88881c5 100644 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -54,6 +54,23 @@ function renderNavLabels() { }); } +// Translate any element marked with data-i18n / data-i18n-placeholder / +// data-i18n-html. Runs on init and on every language change. Used for static +// HTML in index.html (e.g. the Add-Display modal) where t() can't be inlined +// at template time. +function translateStaticDom(root = document) { + root.querySelectorAll('[data-i18n]').forEach((el) => { + const key = el.getAttribute('data-i18n'); + el.textContent = t(key); + }); + root.querySelectorAll('[data-i18n-html]').forEach((el) => { + el.innerHTML = t(el.getAttribute('data-i18n-html')); + }); + root.querySelectorAll('[data-i18n-placeholder]').forEach((el) => { + el.placeholder = t(el.getAttribute('data-i18n-placeholder')); + }); +} + function isAuthenticated() { return !!localStorage.getItem('token'); } @@ -249,7 +266,11 @@ function updateSidebarUser() { // Initialize renderNavLabels(); -window.addEventListener('language-changed', renderNavLabels); +translateStaticDom(); +window.addEventListener('language-changed', () => { + renderNavLabels(); + translateStaticDom(); +}); if (isAuthenticated()) { connectSocket(); diff --git a/frontend/js/i18n/de.js b/frontend/js/i18n/de.js index 66d387d..3f430ae 100644 --- a/frontend/js/i18n/de.js +++ b/frontend/js/i18n/de.js @@ -1048,4 +1048,18 @@ export default { 'help.shortcuts': 'Tastaturkürzel', 'help.shortcut_esc': 'Web-Player zurücksetzen (auf Player-Seite)', 'help.shortcut_f': 'Vollbild umschalten (Web-Player)', + + // Add Display modal + 'add_display.title': 'Bildschirm hinzufügen', + 'add_display.intro': 'Geben Sie den 6-stelligen Kopplungscode ein, der auf dem Bildschirm angezeigt wird.', + 'add_display.pairing_code': 'Kopplungscode', + 'add_display.display_name': 'Anzeigename (optional)', + 'add_display.name_placeholder': 'z. B. Lobby-TV', + 'add_display.need_player': 'Player-App benötigt? Installieren Sie eine, um einen Kopplungscode zu erhalten:', + 'add_display.android_apk': 'Android-APK', + 'add_display.web_player': 'Web-Player', + 'add_display.raspberry_pi': 'Raspberry Pi', + 'add_display.windows': 'Windows', + 'add_display.smart_tv_note': 'Smart TVs (LG/Samsung): öffnen Sie den integrierten Browser und navigieren Sie zu /player', + 'add_display.pair_btn': 'Bildschirm koppeln', }; diff --git a/frontend/js/i18n/en.js b/frontend/js/i18n/en.js index 37bef7c..67ffcd1 100644 --- a/frontend/js/i18n/en.js +++ b/frontend/js/i18n/en.js @@ -1084,4 +1084,18 @@ export default { 'help.shortcuts': 'Keyboard Shortcuts', 'help.shortcut_esc': 'Reset web player (on player page)', 'help.shortcut_f': 'Toggle fullscreen (web player)', + + // Add Display modal (in index.html) + 'add_display.title': 'Add Display', + 'add_display.intro': 'Enter the 6-digit pairing code shown on the display.', + 'add_display.pairing_code': 'Pairing Code', + 'add_display.display_name': 'Display Name (optional)', + 'add_display.name_placeholder': 'e.g., Lobby TV', + 'add_display.need_player': 'Need a player app? Install one to get a pairing code:', + 'add_display.android_apk': 'Android APK', + 'add_display.web_player': 'Web Player', + 'add_display.raspberry_pi': 'Raspberry Pi', + 'add_display.windows': 'Windows', + 'add_display.smart_tv_note': 'Smart TVs (LG/Samsung): open the built-in browser and navigate to /player', + 'add_display.pair_btn': 'Pair Display', }; diff --git a/frontend/js/i18n/es.js b/frontend/js/i18n/es.js index 452ef50..cbcbd20 100644 --- a/frontend/js/i18n/es.js +++ b/frontend/js/i18n/es.js @@ -1047,4 +1047,18 @@ export default { 'help.shortcuts': 'Atajos de teclado', 'help.shortcut_esc': 'Reiniciar reproductor web (en la página del reproductor)', 'help.shortcut_f': 'Alternar pantalla completa (reproductor web)', + + // Add Display modal + 'add_display.title': 'Agregar pantalla', + 'add_display.intro': 'Ingresa el código de vinculación de 6 dígitos mostrado en la pantalla.', + 'add_display.pairing_code': 'Código de vinculación', + 'add_display.display_name': 'Nombre (opcional)', + 'add_display.name_placeholder': 'p. ej., TV Vestíbulo', + 'add_display.need_player': '¿Necesitas la app del reproductor? Instala una para obtener un código:', + 'add_display.android_apk': 'APK Android', + 'add_display.web_player': 'Reproductor web', + 'add_display.raspberry_pi': 'Raspberry Pi', + 'add_display.windows': 'Windows', + 'add_display.smart_tv_note': 'Smart TVs (LG/Samsung): abre el navegador integrado y ve a /player', + 'add_display.pair_btn': 'Vincular pantalla', }; diff --git a/frontend/js/i18n/fr.js b/frontend/js/i18n/fr.js index 9a5ba4b..114c230 100644 --- a/frontend/js/i18n/fr.js +++ b/frontend/js/i18n/fr.js @@ -1048,4 +1048,18 @@ export default { 'help.shortcuts': 'Raccourcis clavier', 'help.shortcut_esc': 'Réinitialiser le lecteur web (sur la page du lecteur)', 'help.shortcut_f': 'Basculer le plein écran (lecteur web)', + + // Add Display modal + 'add_display.title': 'Ajouter un écran', + 'add_display.intro': 'Saisissez le code d\'appairage à 6 chiffres affiché sur l\'écran.', + 'add_display.pairing_code': 'Code d\'appairage', + 'add_display.display_name': 'Nom (facultatif)', + 'add_display.name_placeholder': 'ex. TV du hall', + 'add_display.need_player': 'Besoin d\'une app de lecture ? Installez-en une pour obtenir un code :', + 'add_display.android_apk': 'APK Android', + 'add_display.web_player': 'Lecteur web', + 'add_display.raspberry_pi': 'Raspberry Pi', + 'add_display.windows': 'Windows', + 'add_display.smart_tv_note': 'Smart TVs (LG/Samsung) : ouvrez le navigateur intégré et allez à /player', + 'add_display.pair_btn': 'Apparier l\'écran', }; diff --git a/frontend/js/i18n/pt.js b/frontend/js/i18n/pt.js index cec946c..f2ba3d8 100644 --- a/frontend/js/i18n/pt.js +++ b/frontend/js/i18n/pt.js @@ -1048,4 +1048,18 @@ export default { 'help.shortcuts': 'Atalhos de teclado', 'help.shortcut_esc': 'Reiniciar player web (na página do player)', 'help.shortcut_f': 'Alternar tela cheia (player web)', + + // Add Display modal + 'add_display.title': 'Adicionar tela', + 'add_display.intro': 'Digite o código de pareamento de 6 dígitos exibido na tela.', + 'add_display.pairing_code': 'Código de pareamento', + 'add_display.display_name': 'Nome (opcional)', + 'add_display.name_placeholder': 'ex. TV do lobby', + 'add_display.need_player': 'Precisa de um app player? Instale um para obter um código:', + 'add_display.android_apk': 'APK Android', + 'add_display.web_player': 'Player web', + 'add_display.raspberry_pi': 'Raspberry Pi', + 'add_display.windows': 'Windows', + 'add_display.smart_tv_note': 'Smart TVs (LG/Samsung): abra o navegador integrado e vá para /player', + 'add_display.pair_btn': 'Parear tela', }; diff --git a/server/player/index.html b/server/player/index.html index 4c3f50b..6d4ec98 100644 --- a/server/player/index.html +++ b/server/player/index.html @@ -85,11 +85,85 @@