diff --git a/app/src/server.js b/app/src/server.js index e76a9541..3505868d 100755 --- a/app/src/server.js +++ b/app/src/server.js @@ -39,7 +39,7 @@ dependencies: { * @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon * @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661 * @author Miroslav Pejic - miroslav.pejic.85@gmail.com - * @version 1.4.66 + * @version 1.4.67 * */ diff --git a/package.json b/package.json index a503e2c2..b7cde863 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mirotalk", - "version": "1.4.66", + "version": "1.4.67", "description": "A free WebRTC browser-based video call", "main": "server.js", "scripts": { diff --git a/public/js/client.js b/public/js/client.js index 01aacf2f..500318ff 100644 --- a/public/js/client.js +++ b/public/js/client.js @@ -15,7 +15,7 @@ * @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon * @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661 * @author Miroslav Pejic - miroslav.pejic.85@gmail.com - * @version 1.4.66 + * @version 1.4.67 * */ @@ -11039,7 +11039,7 @@ function showAbout() { Swal.fire({ background: swBg, position: 'center', - title: 'WebRTC P2P v1.4.66', + title: 'WebRTC P2P v1.4.67', imageAlt: 'mirotalk-about', imageUrl: images.about, customClass: { image: 'img-about' }, diff --git a/public/js/translate.js b/public/js/translate.js index dc503aaf..e091fb9f 100644 --- a/public/js/translate.js +++ b/public/js/translate.js @@ -1,35 +1,54 @@ 'use strict'; -const script = document.createElement('script'); -script.setAttribute('async', ''); -script.setAttribute('src', 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); -document.head.appendChild(script); +/** + * Dynamically load an external script and return a Promise. + */ +function loadScript(src) { + return new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.async = true; + script.src = src; + script.onload = resolve; + script.onerror = reject; + document.head.appendChild(script); + }); +} /** - * Start Google Translate - * https://www.w3schools.com/howto/howto_google_translate.asp + * Initialize Google Translate. */ function googleTranslateElementInit() { new google.translate.TranslateElement( { pageLanguage: 'en', - autoDisplay: false, // Prevent the popup from showing by default + autoDisplay: false, // Prevent default popup }, 'google_translate_element', ); - const interval = setInterval(() => { - const language = brand.app.language ? brand.app.language : 'en'; - - if (language === 'en') { - clearInterval(interval); - } + const language = brand?.app?.language || 'en'; + if (language === 'en') return; // No need to switch if default is 'en' + // Use MutationObserver to detect the dropdown + const observer = new MutationObserver(() => { const select = document.querySelector('.goog-te-combo'); if (select) { select.value = language; select.dispatchEvent(new Event('change')); - clearInterval(interval); + observer.disconnect(); // Stop observing once the dropdown is found } - }, 500); + }); + + observer.observe(document.body, { childList: true, subtree: true }); } + +/** + * Load Google Translate and initialize. + */ +(async function initGoogleTranslate() { + try { + await loadScript('https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'); + } catch (error) { + console.error('Failed to load Google Translate script:', error); + } +})(); \ No newline at end of file