blob: d1a8a11979b38cce658f4f9f6177db2010dd63b4 [file]
'use client';
import { useEffect, useState } from 'react';
import clsx from 'clsx';
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
import { useLang } from '@/app/context/LangContext';
const LanguageMenu = () => {
const { lang, setLang, theme } = useLang();
const [mounted, setMounted] = useState(false);
const languageNames = {
en: 'English',
zh: '简体中文',
hant: '繁體中文',
ja: '日本語',
fr: 'Français',
de: 'Deutsch',
es: 'Español',
id: 'Indonesia',
ko: '한국어',
ru: 'Русский',
vi: 'Việt Nam',
pt: 'Português',
it: 'Italiano',
ms: 'Malay',
tr: 'Turkish',
ar: 'العربية',
};
const handleLangChange = (newLang) => {
setLang(newLang);
};
const currentLanguage = languageNames[lang] || 'Unknown';
const textClass = clsx(theme === 'dark' ? 'text-gray-200' : 'text-gray-800');
const iconFilterClass = clsx(theme === 'dark' ? 'filter invert' : '');
useEffect(() => {
setMounted(true);
}, []);
if (!mounted) {
return null;
}
return (
<DropdownMenu.Root>
<DropdownMenu.Trigger>
<button
className={clsx(
'bg-secondary',
'cursor-pointer',
'flex items-center',
'transition-colors duration-200',
'rounded-lg',
'px-2 py-1',
'border border-primary',
'text-primary',
'hover:bg-primary hover:text-primary-foreground',
textClass,
)}
>
<img
src="LanguageSwitching.svg"
alt="Language"
className={clsx('w-6 h-6 mr-1', iconFilterClass)}
style={{
transition: 'filter 0.5s',
}}
/>
{currentLanguage}
</button>
</DropdownMenu.Trigger>
<DropdownMenu.Content sideOffset={5} className="bg-white dark:bg-slate-800 rounded-md p-2 z-10 dropdown-content">
{Object.keys(languageNames).map((code) => {
return (
<DropdownMenu.Item
key={code}
onSelect={() => {
handleLangChange(code);
}}
className="p-2 cursor-pointer hover:bg-primary/20 dark:hover:bg-primary/30 rounded transition-colors duration-200 dark:text-gray-200"
>
{languageNames[code]}
</DropdownMenu.Item>
);
})}
</DropdownMenu.Content>
</DropdownMenu.Root>
);
};
export default LanguageMenu;