import React, { Component } from 'react';
import Box from '@mui/material/Box';
import Button from '@mui/material/Button';
import Menu from '@mui/material/Menu';
import MenuItem from '@mui/material/MenuItem';
import Typography from '@mui/material/Typography';
import { withI18n } from '../i18n/withTranslation.js';
class LanguageSwitcher extends Component {
constructor(props) {
super(props);
this.state = {
anchorEl: null,
loadedFlags: {}
};
}
handleClick = (event) => {
this.setState({ anchorEl: event.currentTarget });
};
handleClose = () => {
this.setState({ anchorEl: null });
};
handleLanguageChange = (language) => {
const { languageContext } = this.props;
if (languageContext) {
languageContext.changeLanguage(language);
}
this.handleClose();
};
// Lazy load flag components
loadFlagComponent = async (lang) => {
if (this.state.loadedFlags[lang]) {
return this.state.loadedFlags[lang];
}
try {
const flagMap = {
'de': () => import('country-flag-icons/react/3x2').then(m => m.DE),
'en': () => import('country-flag-icons/react/3x2').then(m => m.US),
'es': () => import('country-flag-icons/react/3x2').then(m => m.ES),
'fr': () => import('country-flag-icons/react/3x2').then(m => m.FR),
'it': () => import('country-flag-icons/react/3x2').then(m => m.IT),
'pl': () => import('country-flag-icons/react/3x2').then(m => m.PL),
'hu': () => import('country-flag-icons/react/3x2').then(m => m.HU),
'sr': () => import('country-flag-icons/react/3x2').then(m => m.RS),
'bg': () => import('country-flag-icons/react/3x2').then(m => m.BG),
'ru': () => import('country-flag-icons/react/3x2').then(m => m.RU),
'uk': () => import('country-flag-icons/react/3x2').then(m => m.UA),
'sk': () => import('country-flag-icons/react/3x2').then(m => m.SK),
'cs': () => import('country-flag-icons/react/3x2').then(m => m.CZ),
'ro': () => import('country-flag-icons/react/3x2').then(m => m.RO),
'zh': () => import('country-flag-icons/react/3x2').then(m => m.CN)
};
const flagLoader = flagMap[lang];
if (flagLoader) {
const FlagComponent = await flagLoader();
this.setState(prevState => ({
loadedFlags: {
...prevState.loadedFlags,
[lang]: FlagComponent
}
}));
return FlagComponent;
}
} catch (error) {
console.warn(`Failed to load flag for language: ${lang}`, error);
}
return null;
};
getLanguageFlag = (lang) => {
const FlagComponent = this.state.loadedFlags[lang];
if (FlagComponent) {
return (
);
}
// Loading placeholder or fallback
return (
{this.getLanguageLabel(lang)}
);
};
// Load flags when menu opens
componentDidUpdate(prevProps, prevState) {
const { anchorEl } = this.state;
const { languageContext } = this.props;
if (anchorEl && !prevState.anchorEl && languageContext) {
// Menu just opened, lazy load all flags
languageContext.availableLanguages.forEach(lang => {
if (!this.state.loadedFlags[lang]) {
this.loadFlagComponent(lang);
}
});
}
}
getLanguageLabel = (lang) => {
const labels = {
'de': 'DE',
'en': 'US',
'es': 'ES',
'fr': 'FR',
'it': 'IT',
'pl': 'PL',
'hu': 'HU',
'sr': 'RS',
'bg': 'BG',
'ru': 'RU',
'uk': 'UA',
'sk': 'SK',
'cs': 'CZ',
'ro': 'RO',
'zh': 'CN'
};
return labels[lang] || lang.toUpperCase();
};
getLanguageName = (lang) => {
const names = {
'de': 'Deutsch',
'en': 'English',
'es': 'Español',
'fr': 'Français',
'it': 'Italiano',
'pl': 'Polski',
'hu': 'Magyar',
'sr': 'Српски',
'bg': 'Български',
'ru': 'Русский',
'uk': 'Українська',
'sk': 'Slovenčina',
'cs': 'Čeština',
'ro': 'Română',
'zh': '中文'
};
return names[lang] || lang;
};
render() {
const { languageContext } = this.props;
const { anchorEl } = this.state;
if (!languageContext) {
return null;
}
const { currentLanguage, availableLanguages } = languageContext;
const open = Boolean(anchorEl);
return (
);
}
}
export default withI18n()(LanguageSwitcher);