/**
* 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);
})();