const app_translations = { fr: { "menu.languageLabel": "Langue", "menu.title": "Configurez votre partie", "menu.subtitle": "Reglez l'horloge, choisissez le mode de block, puis lancez la partie depuis le meme systeme de scenes.", "menu.startGame": "Lancer la partie", "menu.settingsTitle": "Parametres", "menu.startTimeLabel": "Temps initial", "menu.startTimeHelp": "Minutes pour les blancs et les noirs", "menu.startMoveLabel": "Coups avant cube", "menu.startMoveHelp": "Nombre de coups avant la phase cube", "menu.blockTimeLabel": "Temps du block", "menu.blockTimeHelp": "Minutes", "menu.maxIncrementLabel": "Increment maximal", "menu.maxIncrementHelp": "Secondes", "menu.blockModeLabel": "La partie commence avec", "menu.blockModeHelp": "Choisissez le mode de block utilise au debut de la partie", "menu.blockPlus": "Block +", "menu.blockMinus": "Block -", "clock.start": "Start", "clock.whiteWins": "Blanc gagne", "clock.blackWins": "Noir gagne", "clock.draw": "Nulle", "clock.blockTime": "Temps restant Block : {time}", "clock.movesWhite": "Coup restant Blanc : {number}", "clock.movesBlack": "Coup restant Noir : {number}", "cube.title": "Phase Cube", "cube.subtitle": "Maintiens 2 secondes pour lancer le timer, puis touche de nouveau quand le cube est termine.", "cube.hintStart": "Appui long pour demarrer", "cube.hintFinish": "Touchez quand le cube est fini", "cube.timeWhite": "Temps au cube Blanc : {time}", "cube.timeBlack": "Temps au cube Noir : {time}", "endgame.kicker": "Partie terminee", "endgame.subtitle": "Le resultat final est valide. Vous pouvez revenir au menu pour preparer une nouvelle partie.", "endgame.backToMenu": "Retour au menu", "endgame.whiteWon": "Les Blancs ont gagne", "endgame.blackWon": "Les Noirs ont gagne", "endgame.draw": "Match nul", "common.whiteUpper": "BLANC", "common.blackUpper": "NOIR" }, en: { "menu.languageLabel": "Language", "menu.title": "Configure your match", "menu.subtitle": "Set the clock, choose the block mode, then launch the game from the same scene system.", "menu.startGame": "Start Game", "menu.settingsTitle": "Settings", "menu.startTimeLabel": "Start Time", "menu.startTimeHelp": "Minutes for both white and black", "menu.startMoveLabel": "Moves Before Cube", "menu.startMoveHelp": "Number of moves before the cube phase", "menu.blockTimeLabel": "Block Time", "menu.blockTimeHelp": "Minutes", "menu.maxIncrementLabel": "Max Increment", "menu.maxIncrementHelp": "Seconds", "menu.blockModeLabel": "Game Starts With", "menu.blockModeHelp": "Choose the block mode used when the game begins", "menu.blockPlus": "Block +", "menu.blockMinus": "Block -", "clock.start": "Start", "clock.whiteWins": "White wins", "clock.blackWins": "Black wins", "clock.draw": "Draw", "clock.blockTime": "Block time left: {time}", "clock.movesWhite": "White moves left: {number}", "clock.movesBlack": "Black moves left: {number}", "cube.title": "Cube Phase", "cube.subtitle": "Hold for 2 seconds to start the timer, then tap again when the cube is finished.", "cube.hintStart": "Long press to start", "cube.hintFinish": "Tap when the cube is finished", "cube.timeWhite": "White cube time: {time}", "cube.timeBlack": "Black cube time: {time}", "endgame.kicker": "Game Over", "endgame.subtitle": "The final result is confirmed. You can return to the menu to set up a new game.", "endgame.backToMenu": "Back to menu", "endgame.whiteWon": "White wins", "endgame.blackWon": "Black wins", "endgame.draw": "Draw", "common.whiteUpper": "WHITE", "common.blackUpper": "BLACK" } } let app_language = localStorage.getItem("menu_language") || "fr" function get_app_translation(key, params = {}) { const dictionary = app_translations[app_language] || app_translations.fr const fallback_dictionary = app_translations.fr let text = dictionary[key] || fallback_dictionary[key] || key Object.keys(params).forEach((param_key) => { text = text.replaceAll(`{${param_key}}`, params[param_key]) }) return text } function apply_static_translations() { document.querySelectorAll("[data-i18n]").forEach((element) => { const translated_text = get_app_translation(element.dataset.i18n) if (element.tagName === "INPUT") { element.value = translated_text } else { element.textContent = translated_text } }) } function apply_app_language(language) { app_language = app_translations[language] ? language : "fr" localStorage.setItem("menu_language", app_language) document.documentElement.lang = app_language const language_select = document.getElementById("MenuLanguage") if (language_select) { language_select.value = app_language } apply_static_translations() if (typeof refresh_clock_scene_translations === "function") { refresh_clock_scene_translations() } if (typeof refresh_cube_scene_translations === "function") { refresh_cube_scene_translations() } if (typeof refresh_endgame_scene_translations === "function") { refresh_endgame_scene_translations() } }