fix: add languageSelector function and translate icon for admin context

- Add languageSelector() function to admin init-alpine.js for use
  in language selector macros on admin components page
- Add 'translate' icon to icons.js for language selector display

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-13 22:46:29 +01:00
parent 60f7de56ac
commit 94d268f330
2 changed files with 55 additions and 1 deletions

View File

@@ -163,4 +163,57 @@ function data() {
// ─────────────────────────────────────────────────────────────────
currentPage: ''
}
}
}
/**
* Language selector component for i18n support
* Used by language_selector macros in templates
*
* @param {string} currentLang - Current language code (e.g., 'fr')
* @param {Array} enabledLanguages - Array of enabled language codes
* @returns {Object} Alpine.js component data
*/
function languageSelector(currentLang, enabledLanguages) {
return {
isLangOpen: false,
currentLang: currentLang || 'fr',
languages: enabledLanguages || ['fr', 'de', 'en'],
languageNames: {
'en': 'English',
'fr': 'Français',
'de': 'Deutsch',
'lb': 'Lëtzebuergesch'
},
languageFlags: {
'en': 'gb',
'fr': 'fr',
'de': 'de',
'lb': 'lu'
},
async setLanguage(lang) {
if (lang === this.currentLang) {
this.isLangOpen = false;
return;
}
try {
const response = await fetch('/api/v1/language/set', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ language: lang })
});
if (response.ok) {
this.currentLang = lang;
window.location.reload();
}
} catch (error) {
console.error('Failed to set language:', error);
}
this.isLangOpen = false;
}
};
}
// Export to window for use in templates
window.languageSelector = languageSelector;