/** * Language Selector Component * Mobile: Icon-only buttons (flags) * Desktop: Dropdown with full language names */ (function() { const supportedLanguages = [ { code: 'en', name: 'English', flag: '🇬🇧' }, { code: 'de', name: 'Deutsch', flag: '🇩🇪' }, { code: 'fr', name: 'Français', flag: '🇫🇷' }, { code: 'mi', name: 'Te Reo Māori', flag: '🇳🇿', disabled: true, tooltip: 'Coming when system is complete' } ]; /** * Create desktop dropdown selector (with text) */ function createDesktopSelector(currentLang) { return ` `; } /** * Create mobile icon-only selector */ function createMobileSelector(currentLang) { return `
${supportedLanguages.filter(lang => !lang.disabled).map(lang => ` `).join('')}
`; } /** * Create mobile menu language selector (inside drawer) */ function createMobileMenuSelector(currentLang) { const container = document.getElementById('mobile-menu-language-selector'); if (!container) return; const selectorHTML = `

Language

${supportedLanguages.map(lang => ` `).join('')}
`; container.innerHTML = selectorHTML; // Attach event listeners for mobile menu buttons document.querySelectorAll('.mobile-menu-lang-btn').forEach(btn => { if (!btn.disabled) { btn.addEventListener('click', function(e) { const selectedLang = this.getAttribute('data-lang'); if (window.I18n && selectedLang) { window.I18n.setLanguage(selectedLang); // Close mobile menu after selection const mobileMenu = document.getElementById('mobile-menu'); if (mobileMenu) { mobileMenu.classList.add('hidden'); document.body.style.overflow = ''; } } }); } }); } /** * Initialize language selector */ function createLanguageSelector() { const container = document.getElementById('language-selector-container'); if (!container) return; const currentLang = (window.I18n && window.I18n.currentLang) || 'en'; // Create both mobile and desktop versions const combinedHTML = createMobileSelector(currentLang) + createDesktopSelector(currentLang); container.innerHTML = combinedHTML; // Attach event listener for desktop dropdown const desktopDropdown = document.getElementById('language-selector-dropdown'); if (desktopDropdown && window.I18n) { desktopDropdown.addEventListener('change', function(e) { const selectedLang = e.target.value; window.I18n.setLanguage(selectedLang); }); } // Attach event listeners for mobile icon buttons document.querySelectorAll('.language-btn').forEach(btn => { btn.addEventListener('click', function(e) { const selectedLang = this.getAttribute('data-lang'); if (window.I18n && selectedLang) { window.I18n.setLanguage(selectedLang); } }); }); // Initialize mobile menu language selector (if container exists) createMobileMenuSelector(currentLang); } /** * Update UI when language changes */ function updateLanguageUI(newLang) { // Update mobile icon buttons document.querySelectorAll('.language-btn').forEach(btn => { const lang = btn.getAttribute('data-lang'); if (lang === newLang) { btn.classList.add('bg-blue-100', 'ring-2', 'ring-blue-500'); btn.classList.remove('bg-white', 'border', 'border-gray-300'); btn.setAttribute('aria-pressed', 'true'); } else { btn.classList.remove('bg-blue-100', 'ring-2', 'ring-blue-500'); btn.classList.add('bg-white', 'border', 'border-gray-300'); btn.setAttribute('aria-pressed', 'false'); } }); // Update desktop dropdown const dropdown = document.getElementById('language-selector-dropdown'); if (dropdown) { dropdown.value = newLang; } // Update mobile menu buttons document.querySelectorAll('.mobile-menu-lang-btn').forEach(btn => { const lang = btn.getAttribute('data-lang'); if (lang === newLang) { btn.classList.add('bg-blue-50', 'text-blue-700'); btn.classList.remove('text-gray-700', 'hover:bg-gray-50'); } else { btn.classList.remove('bg-blue-50', 'text-blue-700'); btn.classList.add('text-gray-700', 'hover:bg-gray-50'); } }); } // Listen for language change events window.addEventListener('languageChanged', function(e) { if (e.detail && e.detail.language) { updateLanguageUI(e.detail.language); } }); // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', createLanguageSelector); } else { createLanguageSelector(); } // Re-initialize when mobile menu is rendered (if needed) window.addEventListener('mobileMenuRendered', createLanguageSelector); })();